package com.tuozixuan.camel;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

/**
 * 
 * 
 * <pre>
 * https://camel.apache.org/components/next/file-component.html
 * https://blog.csdn.net/Simba_cheng/article/details/79149434
 * 
 * Common
 * autoCreate：是否自动创建缺少的目录。默认为true
 * bufferSize: 缓冲区大小。写缓冲区大小以字节为单位，默认131072B = 128KB
 * fileName：文件名
 * flatten：拼合用于拼合文件名路径去除任何前导路径，所以它只是文件名。 这允许您递归地使用子目录，但是当您将文件写入另一个目录时，它们将被写入一个目录中。 在生产者上将其设置为true将强制执行：在CamelFileName头中接收到的任何文件名将被剥离用于任何前导路径。
 * charset：字符集。Camel2.9.3：这个选项用来指定文件的编码。 你可以在消费者上使用它来指定文件的编码，这使得骆驼知道应该加载文件内容的字符集，以防文件内容被访问。 同样，当写入一个文件时，你可以使用这个选项来指定写入文件的字符集
 * copyAndDeleteOnRenameFail：是否备份和复制并删除文件，以防文件无法直接重命名。 该选项不适用于FTP组件。
 * renameUsingCopy：使用复制和删除策略执行重命名操作。 这主要用于常规重命名操作不可靠的环境，例如跨越不同的文件系统或网络。 此选项优先于copyAndDeleteOnRenameFail参数，该参数将自动回退到复制和删除策略，但仅在其他延迟之后。
 * 
 * Consumer
 * initialDelay: 初始延迟。轮询文件/目录之前的毫秒数开始。默认值：1000
 * delay：下一轮轮询文件/目录之前的毫秒数。默认值：500
 * useFixedDelay：控制是否使用固定延迟或固定速率。
 * runLoggingLevel：消费者轮询时记录一个开始/完整的日志行。 该选项允许您为此配置日志记录级别。默认值：TRACE
 * recursive：如果一个目录，也会在所有子目录中查找文件。默认值：false
 * delete：如果为true，则文件在成功处理后将被删除。默认值：false
 * noop：空操作。如果为true，则不会以任何方式移动或删除文件。 此选项适用于只读数据或ETL类型要求。 如果noop = true，Camel也会设置idempotent = true，以避免重复使用同一个文件。默认值：false
 * preMove：表达式（如文件语言）用于在处理之前移动文件名时动态设置文件名。 例如，要将正在进行的文件移动到订单目录中，请将此值设置为订购。
 * move：表达式（如文件语言）用于在处理后移动文件名时动态设置文件名。 要将文件移动到.done子目录，只需输入.done。
 * moveFailed：
 * include：用于包含文件，如果文件名匹配正则表达式模式
 * exclude: 用于排除文件，如果文件名匹配正则表达式模式
 * antInclude：包含Ant风格的过滤器，例如antInclude = * / .txt。 可以用逗号分隔的格式指定多个包含
 * antExclude：ant风格过滤器排除。 如果使用antInclude和antExclude，则antExclude优先于antInclude。 多个排除可能以逗号分隔的格式指定
 * antFilterCaseSensitive：ant风格的过滤器是否区分大小写。
 * 
 * Producer
 * fileExist：如果文件已经存在，并且名称相同，该怎么办。 可以指定下列值：
 * 		Override - 覆盖取代现有的文件。
 * 		Append - 追加将内容添加到现有的文件。
 * 		Fail - 失败抛出一个GenericFileOperationException，表示已经有一个现有的文件。
 * 		Ignore - 忽略问题，并不覆盖现有的文件，但假设一切都没问题。
 * 		Move - 移动（Camel2.10.1向前）要求也配置moveExisting选项。 eagerDeleteTargetFile可用于控制如何移动文件，并且已经存在文件，否则会导致移动操作失败。 在写入目标文件之前，移动选项将移动任何现有的文件。
 * 		TryRename - TryRename（Camel2.11.1以上）只适用于tempFileName选项正在使用。 这允许尝试将文件从临时名称重命名为实际名称，而不进行任何存在检查。 在某些文件系统，特别是FTP服务器上，这种检查可能会更快。
 * tempPrefix：临时前缀。此选项用于使用临时名称写入文件，然后在写入完成后将其重命名为实名。 可以用来识别正在写入的文件，也可以避免消费者（不使用独占读锁）读取正在进行的文件。 上传大文件时经常使用FTP。
 * tempFileName：临时文件名。与tempPrefix选项相同，但是在使用文件语言时，对临时文件名的命名提供更精细的控制。
 * moveExisting：Camel2.10.1：表达式（如文件语言）用于计算fileExist = Move时使用的文件名称。 要将文件移入备份子目录，只需输入备份。
 * keepLastModified：将保留源文件的最后修改时间戳（如果有的话）。 将使用Exchange.FILE_LAST_MODIFIED标头来定位时间戳。 这个头文件可以包含一个java.util.Date或者带有时间戳的long。 如果时间戳存在并且选项已启用，则会在写入的文件上设置此时间戳。
 * eagerDeleteTargetFile：Camel2.3：是否急切地删除任何现有的目标文件。 此选项仅适用于使用fileExists = Override和tempFileName选项。 您可以使用它来禁用（将其设置为false）在写入临时文件之前删除目标文件。 例如，您可能会写入大文件，并希望在写入临时文件时存在目标文件。 这确保了目标文件只在临时文件被重命名为目标文件名之前的最后时刻才被删除。从Camel 2.10.1开始，此选项也用于控制在启用fileExist = Move时是否删除任何现有文件，并存在现有文件。 如果此选项copyAndDeleteOnRenameFail为false，则在存在现有文件时将抛出异常。 如果为true，则在移动操作之前删除现有文件。
 * doneFileName：完成文件名称。如果提供，那么当原始文件被写入时，Camel将编写第二个文件（称为完成文件）。 完成的文件将是空的。 该选项配置要使用的文件名。 您可以指定一个固定的名称，也可以使用动态占位符。 完成的文件将始终写入与原始文件相同的文件夹中。
 * allowNullBody：用于指定文件写入时是否允许空体。 如果设置为true，那么将会创建一个空文件，当设置为false时，并尝试向文件组件发送一个空体时，GenericFileWriteException将抛出一条消息'Can not write null body to file'。如果fileExist = Override，文件将被截断。 如果fileExist =追加文件将保持不变。
 * forceWrites：Camel2.10.5 / 2.11：是否强制同步写入文件系统。 如果你不想要这个级别的保证，例如写入日志/审计日志等，你可以关掉它。 这会产生更好的性能。
 * chmod：Camel2.15.0：指定生产者发送的文件权限，chmod值必须在000到777之间; 如果有像0755这样的前导数字，我们将忽略它。
 * chmodDirectory：Camel2.17.0：指定生产者创建缺少目录时使用的目录权限，chmod值必须在000到777之间; 如果有像0755这样的前导数字，我们将忽略它。
 * </pre>
 */
@Component
public class FileRouter extends RouteBuilder {

	@Override
	public void configure() throws Exception {
		
		// 把old文件夹下的文件移动到new文件夹下（old文件夹下的文件夹及其中的文件不会移动）
//        from("file:D:\\old").to("file:D:\\new");
        
		/* autoCreate：是否自动创建缺少的目录。默认为true */
		// 代码说明：源目录不存在时不会自动创建，目标目录不存在时会自动创建
//        from("file:D:\\old?autoCreate=false").to("file:D:\\new");
//        from("file:D:\\old?autoCreate=false").to("file:D:\\new?autoCreate=true");
        // 代码说明：源目录和目标目录不存在时都不会自动创建
//        from("file:D:\\old?autoCreate=false").to("file:D:\\new?autoCreate=false");
        // 代码说明：源目录不存在时会自动创建，目标目录不存在时不会自动创建
//        from("file:D:\\old").to("file:D:\\new?autoCreate=false");
//        from("file:D:\\old?autoCreate=true").to("file:D:\\new?autoCreate=false");
        
        /** bufferSize: 缓冲区大小。写缓冲区大小以字节为单位，默认131072B = 128KB */
//        from("file:D:\\old?bufferSize=131072").to("file:D:\\new");
        
        /** initialDelay: 初始延迟。轮询文件/目录之前的毫秒数开始。 */
//        from("file:D:\\old?initialDelay=10000").to("file:D:\\new");
		
//		from("file:D:\\old?include=test.txt").to("file:D:\\new");
		
		
		from("file:D:\\old?include=test.txt").process(new Processor() {

			@Override
			public void process(Exchange exchange) throws Exception {
				String body = exchange.getMessage().getBody(String.class);
				System.out.println(body);
				exchange.getMessage().setBody("[" + body + "]");
			}
		}).to("file:D:\\new");
		
//		from("direct:start")
//	    .process(new Processor() {
//	        public void process(Exchange exchange) {
//	            String body = exchange.getMessage().getBody(String.class);
//	            // do something with the body
//	            // and replace it back
//	            exchange.getMessage().setBody(body);
//	        }
//	    })
//	    .to("mock:result");
		
//		from("direct:cheese")
//	    .setBody(simple("Hello ${body}"))
//	    .to("log:hello");
		
	}

}
